#include<iostream>
#include<sys/types.h>
#include<unistd.h>
#include<signal.h>

void handler(int signum)//形参为信号的编号，signal 方法底层会进行回调，自动将对应的信号编号传递过来
{
    std::cout << "我是： " <<getpid() << " , 获得了一个信号: " << signum << std::endl;
    // alarm(3);
}

int main()
{
    signal(SIGALRM , handler);

    alarm(3);//由软件条件产生的信号
    sleep(1);
    //调用系统调用函数alarm ，传秒数，让当前进程在系统内部设定了一个闹钟，OS会在你设定的秒数结束后发送SIGALRM 14号信号
    //AIGALRM的默认动作是终止当前进程

    // int n = alarm(5);//一个进程中只能设定一个闹钟，以最新的为准
    int n = alarm(0);//所以取消闹钟，将参数设置为0即可
    //第二次设定闹钟的新时间，会取消上一次闹钟，并且返回值为上一次闹钟到此处的剩余时间
    std::cout << "剩余时间： " << n << std::endl;

    //使用系统调用signal , 设置接受到相应信号后的动作，忽略SIG_IGN 默认SIG_DFL 自定义捕捉
    //ctrl+c 是2号信号SIGINT ,interrupt 中断
    // signal(SIGINT , SIG_IGN);//忽略
    // signal(SIGINT , SIG_DFL);//默认动作
    //自定义捕捉，哈数的返回类型为void ,参数类型为int
    // signal(SIGINT , handler);
    //ctrl+\是3号信号 SIGQUIT , 也是一个终止信号
    // signal(SIGQUIT , handler);
    signal(SIGABRT , handler);
    //6号信号也是一个特殊的信号，可以捕捉到6号信号，但是依旧会执行其退出的动作

    while(true)
    {
        printf("进程：%d\n" , getpid());
        sleep(1);
        //raise 函数给当前进程发送任意信号,等价于 kill(getpid() , signumber)
        // raise(SIGINT);
        // raise(SIGQUIT);
        //abort 函数，给当前进程发送指定信号SIGABRT，6号信号，也是一个终止信号
        // abort();
    }

    return 0;
}
